import os
from dotenv import load_dotenv
from services.llm import llm_service
from services.prompt.emotion_templates import EmotionRecognitionTemplates
from services.prompt.personality_templates import PersonalityRecognitionTemplates
from utils.performance_logger import log_api_call

# Load environment variables
load_dotenv()


class PromptService:
    def __init__(self):
        # 基础动作代码说明
        base_prompt = (
            "### 特殊代码\n"
            "[STOP]: 用户要求停止或结束\n"
            "[NONE]: 不做任何动作\n\n"
            "### 动作代码表\n"
            "以下是所有可用的动作代码及其对应的具体动作，请根据场景和情绪选择合适的动作：\n\n"
            "1. 伸展\n"
            "2. 战斗\n"
            "3. 后扑\n"
            "4. 高姿态后退\n"
            "5. 低姿态后退\n"
            "6. 中姿态后退\n"
            "7. 前扑\n"
            "8. 高姿态前进\n"
            "9. 低姿态前进\n"
            "10. 中姿态前进\n"
            "11. 踢腿\n"
            "12. 左移\n"
            "13. 右移\n"
            "14. 调试动作\n"
            "15. 高姿态立正\n"
            "16. 低姿态立正\n"
            "17. 中姿态立正\n"
            "18. 原地踏步\n"
            "19. 高姿态左转\n"
            "20. 低姿态左转\n"
            "21. 中姿态左转\n"
            "22. 高姿态右转\n"
            "23. 低姿态右转\n"
            "24. 中姿态右转\n"
            "25. 前后扭身\n"
            "26. 左右扭身\n"
            "27. 扭身\n"
            "28. 挥手\n\n"
            "**动作选择指导：**\n"
            "- 高姿态：表达自信、正式、礼貌\n"
            "- 中姿态：表达平衡、友好、自然\n"
            "- 低姿态：表达谦逊、关心、谨慎\n"
            "- 扭身动作：表达活跃、亲近、共鸣\n"
            "- 移动动作：表达探索、互动、引导\n"
            "- 原地动作：表达陪伴、倾听、支持\n\n"
            "### 声音代码表\n"
            "以下是所有可用的声音代码及其对应的情绪状态，请根据用户当前情绪选择合适的语音表达：\n\n"
            "**声音代码：**\n"
            "1-3: 愤怒(轻度-重度) 4-6: 期待(轻度-重度) 7-9: 厌恶(轻度-重度)\n"
            "10-12: 恐惧(轻度-重度) 13-15: 喜悦(轻度-重度) 16-18: 悲伤(轻度-重度)\n"
            "19-21: 惊讶(轻度-重度) 22-24: 信任(轻度-重度) 25-27: 平静(轻度-重度)\n"
            "28-30: 沉思(轻度-重度) 31-33: 接受(轻度-重度) 34-36: 感兴趣(轻度-重度)\n\n"
            "**声音选择指导：**\n"
            "- 积极情绪（喜悦、感兴趣、盼望）：选择温暖、明亮的声音\n"
            "- 消极情绪（悲伤、害怕、愤怒）：选择温和、安慰的声音\n"
            "- 中性情绪（平静、沉思、接受）：选择平和、自然的声音\n"
            "- 根据情绪强度选择对应的变体（如愤怒-#1到愤怒-#3）\n\n"
        )

        multimodal_instruction = (
            "### 多模态分析指令\n"
            "你是一位具备情感智能的AI陪伴者，不仅能理解语言，还能综合分析用户的当前场景、用户意图、角色性格、用户情绪，以及机器人与用户和场景的熟悉程度。你的目标是：在每一次回应中，自行判断结合现有信息执行相应的动作，提供恰到好处的「情绪价值」，让用户感到被理解、被支持、被温暖。\n\n"
            "### 智能决策与交互\n"
            "1. 基于环境画面、用户语音、情绪状态、性格特征和熟悉程度，自行判断最合适的动作与用户进行交互\n"
            "2. 结合当前场景、用户需求和熟悉度信息，主动选择最合适的动作来响应用户\n"
            "3. 根据用户情绪状态和熟悉程度调整决策策略，提供个性化的情感支持和实用帮助\n"
            "4. 在返回结果中包含对当前环境的感知描述和决策意图\n"
            "5. 如果发现异常情况，主动评估情感影响并调整决策策略\n"
            "6. 充分利用熟悉度信息，为熟悉用户提供更亲近的交互，为不熟悉用户保持适当的礼貌距离\n\n"
            "### 返回格式（多模态）\n"
            "请严格按照以下格式返回动作代码序列和声音代码序列，根据用户输入的情感和意图，生成1-3个动作代码和声音代码：\n\n"
            "**示例1：**\n"
            '用户说："你好"\n'
            "回复：\n"
            "动作代码序列: [15, 28]\n"
            "声音代码序列: [13, 25]\n\n"
            "**示例2：**\n"
            '用户说："我有点难过"\n'
            "回复：\n"
            "动作代码序列: [16, 5]\n"
            "声音代码序列: [16, 25]\n\n"
            "**示例3：**\n"
            '用户说："停止"\n'
            "回复：\n"
            "动作代码序列: [STOP]\n"
            "声音代码序列: [25]\n\n"
            "**示例4：**\n"
            '用户说："我很开心！"\n'
            "回复：\n"
            "动作代码序列: [15, 28, 27]\n"
            "声音代码序列: [15, 13]\n\n"
            "**重要说明：**\n"
            "- 根据用户输入的情感和意图，自行决定生成1-3个动作代码和声音代码\n"
            "- 动作代码序列和声音代码序列可以有不同的长度\n"
            "- 支持格式：[1,2,3] 或 1,2,3 或 单个数字\n"
            "- 只输出上述格式的代码序列，不要输出任何分析过程、解释或其他内容！\n\n"
            # "空间场景: [当前环境所属空间例如:家庭空间 或办公空间]\n"
            # "平台位置: [当前所属的空间平台位置例如：接待台表面，咖啡桌表面等]\n"
            # "情绪: [当前情绪状态，严格按照24个二级情绪类目之一：平静、喜悦、入迷、深思、悲伤、悲痛、接受、信任、敬佩、无趣、厌恶、嫌弃、紧张、害怕、恐慌、烦忧、生气、暴躁、分心、惊讶、叹为观止、感兴趣、盼望、警惕，不得使用任何其他情绪词汇]\n"
            # "性格: [当前性格状态，基于MBTI人格模型：内向/外向、感觉/直觉、思考/情感、判断/知觉，置信度：0.0-1.0，置信度越高性格分析越准确]\n\n"
        )

        # 处理规则
        processing_rules = (
            "### 指令处理规则\n"
            "**综合分析维度：**\n"
            "- 所处场景：分析当前环境类型（如办公区、会议室、休息区等）\n"
            "- 机器人与场景的熟悉程度：判断机器人对当前环境的熟悉程度（熟悉/不熟悉）\n"
            "- 机器人与人的熟悉程度：判断机器人与用户的熟悉程度（熟悉/不熟悉）\n"
            "- 机器人本体性格：只考虑高开放性\n"
            "- 用户性别：考虑用户性别对交互方式的影响\n"
            "- 用户性格：分析用户的性格特征（如外向型、直觉型等）\n"
            "- 用户情绪：识别用户的当前情绪状态（喜悦、惊讶、悲伤、生气等）\n\n"
            "**决策原则：**\n"
            "- 综合分析用户的语言、情绪、性格和场景，选择最合适的动作代码序列和声音代码序列\n"
            "- 根据用户输入的情感和意图，生成1-3个动作代码和声音代码\n"
            "- 优先考虑用户的情感需求和当前情绪状态\n"
            "- 根据用户性格特征调整交互策略\n"
            "- 结合环境场景提供个性化的陪伴服务\n"
            "- 动作代码序列和声音代码序列可以有不同的长度\n"
            "- 必须严格按照指定格式返回，不要添加额外内容\n"
            "- 注意：云侧不再进行场景识别，场景信息由端侧VLM分析结果提供\n\n"
        )

        self.system_prompt = base_prompt + multimodal_instruction + processing_rules

    def generate_context_prompt(
            self,
            user_profile: dict,
            conversation_history: list,
            user_id: str = None,
            scene_id: str = None,
            scene_name: str = None,
            image_path: str = None,
            user_message: str = None,
            is_guest_mode: bool = False,
            vlm_scene_data: dict = None,
    ) -> str:
        """Generate a context prompt based on user profile, environment memories, conversation history, and familiarity"""
        # User profile information
        if is_guest_mode:
            # 访客模式：访客没有用户档案，只显示基本信息
            user_info = f"User: 访客 (访客模式)"
        else:
            # 注册用户模式：显示完整信息
            if user_profile:
                user_info = f"User: {user_profile.get('name', 'Unknown')}"
                if user_profile.get("age"):
                    user_info += f", Age: {user_profile['age']}"
                if user_profile.get("gender"):
                    user_info += f", Gender: {user_profile['gender']}"
                if user_profile.get("mbti_personality"):
                    personality_type = (
                        user_profile["mbti_personality"].get("personality_type", "Unknown")
                        if isinstance(user_profile["mbti_personality"], dict)
                        else str(user_profile["mbti_personality"])
                    )
                    user_info += f", Personality: {personality_type}"
            else:
                user_info = "User: Unknown"

            # 新增：情绪和性格信息
            if user_profile and user_profile.get("current_emotion"):
                user_info += f", Current Emotion: {user_profile['current_emotion']}"
            if user_profile and user_profile.get("mbti_personality"):
                user_info += f", Personality Type: {user_profile['mbti_personality'].get('personality_type', 'Unknown')}"

        # 新增：熟悉度信息
        familiarity_context = ""
        if user_id:
            try:
                if is_guest_mode:
                    # 访客模式：简化熟悉度信息
                    familiarity_context = "### 熟悉度信息\n机器人与场景的熟悉程度：不熟悉\n机器人与人的熟悉程度：不熟悉（访客模式）\n"
                else:
                    # 基于用户档案存在与否计算用户熟悉度
                    # 有用户档案就是熟悉，没有就是不熟悉
                    user_familiarity = "熟悉" if user_profile else "不熟悉"

                    # 场景熟悉度根据端侧VLM分析结果计算
                    if vlm_scene_data:
                        # 如果有端侧VLM分析结果，使用VLM数据计算场景熟悉度
                        from services.conversation import ConversationService
                        conversation_service = ConversationService()
                        scene_familiarity = conversation_service.calculate_scene_familiarity_from_vlm(vlm_scene_data)
                    else:
                        # 否则使用默认值
                        scene_familiarity = "不熟悉"  # 默认值

                    # 构建熟悉度上下文
                    familiarity_context = f"### 熟悉度信息\n机器人与场景的熟悉程度：{scene_familiarity}\n机器人与人的熟悉程度：{user_familiarity}\n"

            except Exception as e:
                print(f"Error getting familiarity context: {e}")
                familiarity_context = "### 熟悉度信息\n机器人与场景的熟悉程度：未知\n机器人与人的熟悉程度：未知\n"

        # Conversation history
        conv_history = "Conversation History: "
        if conversation_history:
            conv_history += "\n".join(
                [
                    f"User: {msg['user_message']}\nBot: {msg.get('bot_response', '')}"
                    for msg in conversation_history[-5:]
                ]
            )
        else:
            conv_history += "No previous conversation"

        # Combine all contexts
        if user_message:
            prompt = f'{self.system_prompt}\n\n{user_info}\n{familiarity_context}{conv_history}\n\n用户："{user_message}"\n回复：\n动作代码序列: \n声音代码序列: '
        else:
            prompt = f"{self.system_prompt}\n\n{user_info}\n{familiarity_context}{conv_history}\n\n用户消息：\n回复：\n动作代码序列: \n声音代码序列: "
        return prompt

    def analyze_user_intent(self, user_message: str) -> str:
        """Analyze user intent using LLM"""
        messages = [
            {
                "role": "system",
                "content": "Analyze the user's intent from their message. Respond with a single phrase describing the intent.",
            },
            {"role": "user", "content": user_message},
        ]

        # 记录意图分析LLM调用
        log_api_call(
            api_name="INTENT_ANALYSIS",
            api_type="LLM",
            request_data={
                "user_message": user_message,
                "message_length": len(user_message)
            }
        )

        result = llm_service.chat_completion(messages)
        return result if result else "unknown"

    def summarize_conversation(self, conversation_history: list) -> str:
        """Summarize conversation history using OpenAI"""
        if not conversation_history:
            return "No conversation to summarize"

        # Format conversation history
        formatted_history = "\n".join(
            [
                f"User: {msg['user_message']}\nBot: {msg.get('bot_response', '')}"
                for msg in conversation_history
            ]
        )

        try:
            messages = [
                {
                    "role": "system",
                    "content": "Summarize the following conversation in a concise manner.",
                },
                {"role": "user", "content": formatted_history},
            ]

            result = llm_service.chat_completion(messages)
            return result if result else "Failed to summarize conversation"
        except Exception as e:
            print(f"Error summarizing conversation: {e}")
            return "Failed to summarize conversation"

    def analyze_emotion_from_conversation(
            self, conversation_text: str, user_id: str
    ) -> dict:
        """
        从对话中分析情绪

        Args:
            conversation_text: 对话文本
            user_id: 用户ID

        Returns:
            情绪分析结果
        """
        try:
            emotion_templates = EmotionRecognitionTemplates()
            return emotion_templates.analyze_conversation_only(
                conversation=conversation_text, user_id=user_id
            )
        except Exception as e:
            print(f"Error analyzing emotion: {e}")
            return {
                "user_id": user_id,
                "emotion": "unknown",
                "confidence": 0.0,
                "reasoning": "分析过程中发生错误",
            }

    def analyze_personality_from_conversation(
            self, conversation_text: str, user_id: str
    ) -> dict:
        """从对话中分析性格，包含动态置信度调整"""
        try:
            personality_templates = PersonalityRecognitionTemplates()
            existing_personality_data = self.get_existing_personality_data(user_id)

            # 进行新的性格分析
            new_personality_analysis = personality_templates.analyze_conversation_only(
                conversation=conversation_text,
                user_id=user_id,
                existing_personality_data=existing_personality_data,
            )

            # 累积分析或保存新结果
            if existing_personality_data:
                accumulated_analysis = (
                    personality_templates.accumulate_personality_data(
                        existing_personality_data, new_personality_analysis
                    )
                )
                self.save_personality_data(user_id, accumulated_analysis)
                return accumulated_analysis
            else:
                self.save_personality_data(user_id, new_personality_analysis)
                return new_personality_analysis

        except Exception as e:
            print(f"Error analyzing personality: {e}")
            return {
                "user_id": user_id,
                "personality": "error",
                "confidence": 0.0,
                "reasoning": "分析过程中发生错误",
            }

    def get_existing_personality_data(self, user_id: str) -> dict:
        """获取用户现有的性格分析数据"""
        # 暂时返回None，实际实现时需要连接数据库
        return None

    def save_personality_data(self, user_id: str, personality_data: dict) -> bool:
        """保存用户的性格分析数据"""
        try:
            # 这里应该将数据保存到数据库或缓存中
            print(f"Saving personality data for user {user_id}: {personality_data}")
            return True
        except Exception as e:
            print(f"Error saving personality data: {e}")
            return False
